RT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>

using std::string;


//class Solution {
//public:
//    //翻转start到end区间的字符串
//    void Reverse(string& s, int start, int end)
//    {
//        char tmp;
//        end--;        //学费了属于是，下次用上
//        while (start < end)
//        {
//            tmp = s[start];
//            s[start] = s[end];
//            s[end] = tmp;
//            start++;
//            end--;
//        }
//    }
//
//    string reverseStr(string s, int k)
//    {
//        int len = s.size();
//        for (int i = 0; i < len; i += 2 * k)
//        {
//            if (i + k < len)
//                Reverse(s, i, i + k);
//            else
//                Reverse(s, i, len);
//        }
//        return s;
//    }
//};

// public:

//     void Swap(string &s , int left, int right)
//     {
//         while(left<=right)
//         {
//             std::swap(s[left],s[right]);
//             left++;
//             right--;
//         }
//     }

//     string reverseStr(string s, int k) {
//         int sz=s.size();
//         int i=0;
//         if((sz<k) || (sz>=k && sz<2*k))
//         {
//             Swap(s,0,sz-1);
//         }
//         else if(sz<3*k)
//         {
//             Swap(s,0,k-1);
//         }
//         else if(sz<4*k)
//         {
//             Swap(s,0,k-1);
//             Swap(s,2*k,3*k-1);
//         }
//         return s;
//     }
// };

//class Solution {
//public:
//
//    void translowLetter(string& s, int sz)
//    {
//        for (int i = 0; i < sz; i++)
//        {
//            if (s[i] >= 'A' && s[i] <= 'Z')
//                s[i] += 32;
//        }
//    }
//
//    bool isPalindrome(string s) {
//        if (s == "")
//            return true;
//
//        int sz = s.size();
//        translowLetter(s, sz);
//        int left = 0;
//        int right = sz - 1;
//        while (left <= right)
//        {
//            //找到第一个小写字母
//            while (s[left] <= 'a' || s[left] >= 'z' && left <= right)
//                left++;
//            //找到第一个小写字母
//            while (s[right] <= 'a' || s[right] >= 'z' && left <= right)
//                right--;
//
//            if (s[left] == s[right])
//            {
//                left++;
//                right--;
//            }
//            else
//            {
//                return false;
//            }
//        }
//        return true;
//    }
//};

//class Solution {
//public:
//
//    void translowLetter(string& s, int sz)
//    {
//        for (int i = 0; i < sz; i++)
//        {
//            if (s[i] >= 'A' && s[i] <= 'Z')
//                s[i] += 32;
//        }
//    }
//
//    bool isPalindrome(string s) {
//        if (s == " ")
//            return true;
//
//        int sz = s.size();
//        translowLetter(s, sz);
//        int left = 0;
//        int right = sz - 1;
//
//        while (left < right)
//        {
//            //找到第一个小写字母
//            while (left < right && s[left] < 'a' || s[left]>'z')
//                left++;
//
//            //找到第一个小写字母
//            while (left < right && s[right] < 'a' || s[right]>'z')
//                right--;
//
//            if (s[left] == s[right])
//            {
//                left++;
//                right--;
//            }
//            else
//            {
//                return false;
//            }
//        }
//        return true;
//    }
//};

/*
*思路：
* 1. 忽略大小写，只考虑字母
* 2. 通过首尾比较的方式，判断其是否为回文
*/
class Solution {
public:
    bool isDigtalOrWord(char ch)
    {
        if ((ch >= '0' && ch <= '9')
            || (ch >= 'a' && ch <= 'z'))
            return true;
        return false;
    }

    bool isPalindrome(string s)
    {
        if (s.empty())
            return true;
        for (int i = 0; i < s.size(); ++i)
        {
            s[i] = tolower(s[i]); //忽略大小写      
        }

        int left = 0;
        int right = s.size() - 1;
        while (left < right)
        {
            //找到左边第一个未比较的字母
            while (left < right && !isDigtalOrWord(s[left]))
                left++;
            //找到右边第一个未比较的字母
            while (left < right && !isDigtalOrWord(s[right]))
                right--;
            //左右两边字母若不相等，则不是回文
            if (s[left] != s[right])
                return false;
            left++;
            right--;
        }
        return true;
    }
};

int main()
{
    Solution s;
    string arr = "OP";
    std::cout << s.isPalindrome(arr) << std::endl;
    return 0;
}
